package com.ruoyi.xuexiao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.xuexiao.domain.entity.KsSsjCqjg;
import com.ruoyi.xuexiao.domain.entity.ZdKz;
import com.ruoyi.xuexiao.domain.param.KsSsjCqjgParam;
import com.ruoyi.xuexiao.domain.vo.KsSsjCqjgExportVo;
import com.ruoyi.xuexiao.domain.vo.KsSsjCqjgVo;
import com.ruoyi.xuexiao.mapper.BasicRegionMapper;
import com.ruoyi.xuexiao.mapper.KsSsjCqjgMapper;
import com.ruoyi.xuexiao.mapper.ZdKzMapper;
import com.ruoyi.xuexiao.service.KsSsjCqjgService;
import lombok.AllArgsConstructor;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * 矿山底数抽查记录-抽取结果Service实现层
 *
 * @author 齐浩宽
 * @since 2024-05-23 22:24:10
 */
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class KsSsjCqjgServiceImpl extends ServiceImpl<KsSsjCqjgMapper, KsSsjCqjg> implements KsSsjCqjgService {
    //矿山底数抽查记录-抽取结果mapper层
    private KsSsjCqjgMapper ksSsjCqjgMapper;

    //矿种mapper层
    private ZdKzMapper zdKzMapper;

    //政区表mapper层
    private BasicRegionMapper basicRegionMapper;

    /**
     * 分页操作
     *
     * @author 齐浩宽
     */
    public static <T> List<T> paginate(List<T> vos, PageDomain pageDomain) {
        int pageNum = pageDomain.getPageNum();
        int pageSize = pageDomain.getPageSize();

        // 避免分页索引为负数
        int skip = Math.max((pageNum - 1) * pageSize, 0);
        return vos.stream()
                .skip(skip)
                .limit(pageSize)
                .collect(Collectors.toList());
    }

    /**
     * 查询抽取记录详情
     *
     * @author 齐浩宽
     * @since 2024年5月27日17:07:20
     */
    @Override
    public TableDataInfo<KsSsjCqjgVo> queryTheDetailsOfTheRecord(KsSsjCqjgParam ksSsjCqjg) {
        TableDataInfo<KsSsjCqjgVo> info = new TableDataInfo<KsSsjCqjgVo>();
        // 初始化结果列表和ID计数器
        List<KsSsjCqjgVo> vos = new ArrayList<>();
        // 筛选条件
        LambdaQueryWrapper<KsSsjCqjg> wrapper = publicDrawingConditions(ksSsjCqjg);

        // 查询
        List<KsSsjCqjg> codes = ksSsjCqjgMapper.selectList(wrapper);
        AtomicInteger i = new AtomicInteger(1);
        // 转换为视图对象并添加到结果列表中
        codes.forEach(copy -> {
            KsSsjCqjgVo vo = new KsSsjCqjgVo();
            vo.setIdi(i.getAndIncrement());
            // 根据矿种代码查询对应的名称
            List<ZdKz> zdKzs = zdKzMapper.selectList(new LambdaQueryWrapper<ZdKz>()
                    .eq(ZdKz::getKzdm, copy.getKz()));
            // 如果查询到矿种信息，设置矿种名称
            if (!zdKzs.isEmpty()) {
                copy.setKzName(zdKzs.get(0).getKzmc());
            }
            BeanUtils.copyProperties(copy, vo);
            vos.add(vo);
        });
        // 分页
        PageDomain pageDomain = TableSupport.buildPageRequest();
        List<KsSsjCqjgVo> paginate = paginate(vos, pageDomain);
        info.setTotal(codes.size());
        info.setRows(paginate);
        return info;
    }

    /**
     * 筛选查询
     *
     * @author 齐浩宽
     */
    public LambdaQueryWrapper<KsSsjCqjg> publicDrawingConditions(KsSsjCqjgParam ksSsjCqjg) {
        return new LambdaQueryWrapper<KsSsjCqjg>()
                // 抽取记录id
                .eq(KsSsjCqjg::getCqjlId, ksSsjCqjg.getCqjlId())
                //市所在行政区
                .eq(Strings.isNotBlank(ksSsjCqjg.getSszxzq()), KsSsjCqjg::getSszxzq, ksSsjCqjg.getSszxzq())
                // 县所在行政区
                .eq(Strings.isNotBlank(ksSsjCqjg.getXszxzq()), KsSsjCqjg::getXszxzq, ksSsjCqjg.getXszxzq())
                // 矿山名称
                .like(Strings.isNotBlank(ksSsjCqjg.getKsmc()), KsSsjCqjg::getKsmc, ksSsjCqjg.getKsmc())
                // 开采方式
                .like(Strings.isNotBlank(ksSsjCqjg.getKcfs()), KsSsjCqjg::getKcfs, ksSsjCqjg.getKcfs())
                // 许可证号
                .like(Strings.isNotBlank(ksSsjCqjg.getXkzh()), KsSsjCqjg::getXkzh, ksSsjCqjg.getXkzh())
                // 生产状态
                .like(Strings.isNotBlank(ksSsjCqjg.getSczt()), KsSsjCqjg::getSczt, ksSsjCqjg.getSczt());
    }


    /**
     * 导出抽取记录(抽取)
     *
     * @author 齐浩宽
     * @since 2024年5月27日17:07:30
     */
    @Override
    public List<KsSsjCqjgExportVo> exportExtractRecordDetails(KsSsjCqjgParam ksSsjCqjgParam) {
        // 使用公共方法根据参数构建查询条件
        LambdaQueryWrapper<KsSsjCqjg> wrapper = publicDrawingConditions(ksSsjCqjgParam);
        // 执行查询获取所有符合查询条件的数据
        List<KsSsjCqjg> codes = ksSsjCqjgMapper.selectList(wrapper);
        // 初始化城市和县信息的映射，用于后续快速查找名称
        Map<String, String> cityMap = new HashMap<>();
        Map<String, String> countyMap = new HashMap<>();

        // 预先填充城市和县的信息
        for (KsSsjCqjg cqjg : codes) {
            cityMap.put(cqjg.getSszxzq(), cqjg.getSszxzqmc());
            countyMap.put(cqjg.getXszxzq(), cqjg.getXszxzqmc());
        }

        // 对原始数据进行分组，按照市和区进行分组
        Map<String, List<KsSsjCqjg>> groupedByCityAndCounty = codes.stream()
                .collect(Collectors.groupingBy(cqjg -> cqjg.getSszxzq() + "_" + cqjg.getXszxzq()));

        // 对每个分组内的数据进行转换并收集到新的列表中
        List<KsSsjCqjgExportVo> result = new ArrayList<>();
        AtomicInteger i = new AtomicInteger(1);
        for (List<KsSsjCqjg> group : groupedByCityAndCounty.values()) {
            result.addAll(group.stream()
                    .map(cqjg -> {
                        KsSsjCqjgExportVo vo = new KsSsjCqjgExportVo();
                        vo.setId(i.getAndIncrement()); // 序号，每次添加新分组时重新开始计数
                        vo.setYear(cqjg.getYear()); // 年份
                        vo.setSszxzqmc(cityMap.get(cqjg.getSszxzq())); // 市名称
                        vo.setXszxzq(countyMap.get(cqjg.getXszxzq())); // 县名称
                        vo.setXkzh(cqjg.getXkzh()); // 许可证号
                        vo.setKsmc(cqjg.getKsmc()); // 矿山名称
                        vo.setKyqr(cqjg.getKyqr()); // 矿山权人
                        vo.setKzName(nameOfTheMineral(cqjg.getKz())); // 查找矿种名称
                        vo.setKcfs(cqjg.getKcfs()); // 开采方式
                        vo.setSczt(cqjg.getSczt()); // 生产状态
                        vo.setYxqq(cqjg.getYxqq()); // 有效期起
                        vo.setYxqz(cqjg.getYxqz()); // 有效期止
                        return vo;
                    })
                    .collect(Collectors.toList()));
        }
        return result;
    }

    public String nameOfTheMineral(Long kz) {
        LambdaQueryWrapper<ZdKz> queryWrapper = new LambdaQueryWrapper<ZdKz>()
                // 矿种代码
                .eq(ZdKz::getKzdm, kz);
        List<ZdKz> zdKzs = zdKzMapper.selectList(queryWrapper);
        if (!zdKzs.isEmpty()) {
            return zdKzs.get(0).getKzmc();
        } else {
            return null;
        }
    }
}
